home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
001-025
/
disk_005
/
serial
/
serial.c
< prev
Wrap
C/C++ Source or Header
|
1992-05-06
|
9KB
|
339 lines
/*
*
* DISCLAIMER:
*
* This program is provided as a service to the programmer
* community to demonstrate one or more features of the Amiga
* personal computer. These code samples may be freely used
* for commercial or noncommercial purposes.
*
* Commodore Electronics, Ltd ("Commodore") makes no
* warranties, either expressed or implied, with respect
* to the program described herein, its quality, performance,
* merchantability, or fitness for any particular purpose.
* This program is provided "as is" and the entire risk
* as to its quality and performance is with the user.
* Should the program prove defective following its
* purchase, the user (and not the creator of the program,
* Commodore, their distributors or their retailers)
* assumes the entire cost of all necessary damages. In
* no event will Commodore be liable for direct, indirect,
* incidental or consequential damages resulting from any
* defect in the program even if it has been advised of the
* possibility of such damages. Some laws do not allow
* the exclusion or limitation of implied warranties or
* liabilities for incidental or consequential damages,
* so the above limitation or exclusion may not apply.
*
*/
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/ports.h"
#include "exec/libraries.h"
#include "exec/devices.h"
#include "exec/io.h"
#include "devices/serial.h"
struct IOExtSer *IORser;
struct MsgPort *port;
char buffer[200];
extern struct MsgPort *CreatePort();
extern struct IORequest *CreateExtIO();
/* note: to run this program, you must have an external terminal, set
* at 9600 baud, attached to the Amiga serial port. Additionally the
* serial.device file must be located in the directory currently
* assigned to DEVS: (to check this, in AmigaDOS, type: ASSIGN
* then check the directory (usually the boot CLI disk volume, devs directory.
*/
main()
{
int error;
int actual;
unsigned long rbl;
unsigned long brk;
unsigned long baud;
unsigned char rwl;
unsigned char wwl;
unsigned char sf;
unsigned long t0;
unsigned long t1;
/* SET UP the message port in the I/O request */
port = CreatePort (SERIALNAME,0);
if (port == NULL) {
printf("\nProblems during CreatePort");
exit(100);
}
/* Create the request block for passing info to and from the serial device. */
IORser = (struct IOExtSer *)CreateExtIO(port,sizeof(struct IOExtSer));
if (IORser == NULL)
{
printf("\nProblems during CreateExtIO");
goto cleanup1;
}
open:
/* OPEN the serial.device */
if ((error = OpenDevice (SERIALNAME, 0, IORser, 0)) != 0) {
printf ("Serial device did not open, error = %ld",error);
goto cleanup1;
}
/* SET PARAMS for the serial.device */
rbl = 4096;
rwl = 0x08;
wwl = 0x08;
brk = 750000;
baud= 9600;
sf = 0x00;
t0 = 0x51040303;
t1 = 0x03030303;
if ((error = SetParams (IORser,rbl,rwl,wwl,brk,baud,sf,t0,t1)) != 0) {
printf ("Set parameters command returned an error: %ld",error);
goto cleanup2;
}
printf("\nSerial Device opened and accepted parameters");
WriteSer (IORser,"\n\015Device opened ok\n\015", -1);
printf("\nTesting character exact-count output thru SendWaitWrite");
SendWaitWrite (IORser,
"User counts characters in string to send\n\015", 42);
printf("\nTest string length of -1 (make system find end of string)");
SendWaitWrite (IORser,
"or if null terminated string, say '-1'\n\015", -1);
printf("\nType 16 characters to send to amiga...");
printf("\nIf no external terminal is attached, waits forever!!");
WriteSer (IORser,
"\n\015Type 16 characters to send to amiga\n\015", -1);
actual = ReadSer (IORser,buffer,16);
WriteSer (IORser,
"\n\015You typed these printable characters:\n\015", -1);
WriteSer (IORser,buffer, actual);
WriteSer (IORser,"\n\015End of test\n\015", -1);
WriteSer (IORser,"54321.....exit\n\015", 16);
printf("\nTest completed!\n");
/* CLOSE the serial.device */
cleanup2:
CloseDevice (IORser);
cleanup1:
DeletePort (port);
exit (0);
}
/* SERIAL I/O functions */
SetParams(io,rbuf_len,rlen,wlen,brk,baud,sf,ta0,ta1)
struct IOExtSer *io;
unsigned long rbuf_len;
unsigned char rlen;
unsigned char wlen;
unsigned long brk;
unsigned long baud;
unsigned char sf;
unsigned long ta0;
unsigned long ta1;
{
int error;
io->io_ReadLen = rlen;
io->io_BrkTime = brk;
io->io_Baud = baud;
io->io_WriteLen = wlen;
io->io_StopBits = 0x01;
io->io_RBufLen = rbuf_len;
io->io_SerFlags = sf;
io->IOSer.io_Command = SDCMD_SETPARAMS;
io->io_TermArray.TermArray0 = ta0;
io->io_TermArray.TermArray1 = ta1;
if ((error = DoIO (io)) != 0) {
printf ("serial.device setparams error %ld \n", error);
}
return (error);
}
ReadSer(io,data,length)
struct IOExtSer *io;
char *data;
int length;
{
int error;
io->IOSer.io_Data = (APTR)data;
io->IOSer.io_Length = (ULONG)length;
io->IOSer.io_Command = CMD_READ;
if ((error = DoIO (io)) != 0) {
printf ("serial.device read error %ld \n", error);
}
return ((int)io->IOSer.io_Actual);
}
WriteSer(io,data,length)
struct IOExtSer *io;
char *data;
int length;
{
int error;
io->IOSer.io_Data = (APTR)data;
io->IOSer.io_Length = length;
io->IOSer.io_Command = CMD_WRITE;
if ((error = DoIO (io)) != 0) {
printf ("serial.device write error %ld \n", error);
}
return (error);
}
SendWaitWrite(io,data,length)
struct IOExtSer *io;
char *data;
int length;
{
int error;
io->IOSer.io_Data = (APTR)data;
io->IOSer.io_Length = length;
io->IOSer.io_Command = CMD_WRITE;
SendIO (io);
if ((error = WaitIO (io)) != 0) {
printf ("serial.device waitio error %ld \n", error);
}
return ((int)io->IOSer.io_Actual);
}
/***********************************************************************
*
* Exec Support Function -- Extended IO Request
*
***********************************************************************/
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/memory.h"
#include "exec/interrupts.h"
#include "exec/ports.h"
#include "exec/libraries.h"
#include "exec/io.h"
#include "exec/tasks.h"
#include "exec/execbase.h"
extern APTR AllocMem();
/****** exec_support/CreateExtIO **************************************
*
* NAME
* CreateExtIO() -- create an Extended IO request
*
* SYNOPSIS
* ioReq = CreateExtIO(ioReplyPort,size);
*
* FUNCTION
* Allocates memory for and initializes a new IO request block
* of a user-specified number of bytes.
*
* INPUTS
* ioReplyPort - a pointer to an already initialized
* message port to be used for this IO request's reply port.
*
* RESULT
* Returns a pointer to the new block. Pointer is of the type
* struct IORequest.
*
* 0 indicates inability to allocate enough memory for the request block
* or not enough signals available.
*
* EXAMPLE
* struct IORequest *myBlock;
* if( (myBlock = CreateExtIO(myPort,sizeof(struct IOExtTD)) == NULL)
* exit(NO_MEM_OR_SIGNALS);
*
* example used to allocate space for IOExtTD (trackdisk driver
* IO Request block for extended IO operations).
*
* SEE ALSO
* DeleteExtIO
*
***********************************************************************/
struct IORequest *CreateExtIO(ioReplyPort,size)
struct MsgPort *ioReplyPort;
LONG size;
{
struct IORequest *ioReq;
if (ioReplyPort == 0)
return ((struct IORequest *) 0);
ioReq = (struct IORequest *)AllocMem (size, MEMF_CLEAR | MEMF_PUBLIC);
if (ioReq == 0)
return ((struct IORequest *) 0);
ioReq -> io_Message.mn_Node.ln_Type = NT_MESSAGE;
ioReq -> io_Message.mn_Node.ln_Pri = 0;
ioReq -> io_Message.mn_ReplyPort = ioReplyPort;
return (ioReq);
}
/****** exec_support/DeleteExtIO **************************************
*
* NAME
* DeleteExtIO() - return memory allocated for extended IO request
*
* SYNOPSIS
* DeleteExtIO(ioReq,size);
*
* FUNCTION
* See summary line at NAME. Also frees the signal bit which
* had been allocated by the call to CreateExtIO.
*
* INPUTS
* A pointer to the IORequest block whose resources are to be freed.
*
* RESULT
* Frees the memory. Returns (no error conditions shown)
*
* EXAMPLE
* struct IORequest *myBlock;
* DeleteExtIO(myBlock,(sizeof(struct IOExtTD)));
*
* example shows that CreateExtIO had been used to create a trackdisk
* (extended) IO Request block.
*
* SEE ALSO
* CreateExtIO
*
**************************************************************************/
DeleteExtIO(ioExt,size)
struct IORequest *ioExt;
LONG size;
{
ioExt -> io_Message.mn_Node.ln_Type = 0xff;
ioExt -> io_Device = (struct Device *) -1;
ioExt -> io_Unit = (struct Unit *) -1;
FreeMem (ioExt, size);
}